Android — 自定义View(五)之Path操作

前言

同样的,回顾一下上一篇学的知识。在上一篇中,着重讲解了用Canvas绘制图片和文字。绘制图片有两种方式:drawPicture和drawBitmap,对于drawPicture来说,我们形象化的把它比喻成录像机,能够记录Canvas一系列操作并将它保存到Picture中,再把录制的内容绘制出来的话虽然有三种方法,但是我们推荐用Canvas提供的drawPicture方法,主要是因为它不会对后续Canvas造成影响,而且可控性更强。然后是绘制图片的第二种方式,即drawBitmap,这个也没什么好说了,知道Bitmap的四种来源方式以及drawBitmap方法中参数的含义就OK了。接着我们讲到绘制文字,绘制文字还是很简单,也提供了三种方法来绘制:drawText()、drawPosText()、drawTextOnPath()。drawText()方法可以对绘制的文本进行截取,记住是前闭后开;drawPosText()我们不建议使用,毕竟要确定文本中每个字符的坐标值,而drawTextOnPath()我们则是遗留下来了,这篇文章就是来讲解Path的使用。目录如下:

  1. Path的作用和含义
  2. Path常用方法表
  3. Path常用方法详解
  4. 实战之绘制雷达图(蜘蛛网图)

感觉还不错吧,那就接着往下看吧,啦啦啦

Path的作用和含义

作用:

​ 我们之前绘制的图形都是一些简单图形,比如扇形、矩形、圆形等等,而对于一些复杂的图形是没法绘制的,如心形、五角星等等。而使用Path不仅能够绘制一些简单图形,也能绘制一些复杂的图形。另外,根据路径绘制文本和裁剪画布都会用到Path。

含义:

​ Path封装了有直线和曲线(二次、三次贝塞尔曲线)构成的几何路径。你能用Canvas的drawPath来把这条路径绘制出来,也可以用来根据路径绘制文本和裁剪画布。有时我们会用Path来描述一个图像的轮廓,所以也会称Path为为轮廓线,当然,两者并不等价。另外,路径有开放和闭合的区别。

Path常用方法表

作用 相关方法 备注
移动起点 moveTo() 移动下一次操作的起点位置
设置终点 setLastPoint() 重置当前Path中最后一个点的位置,如果在绘制之前调用,效果和moveTo()相同
连接直线 lineTo() 添加上一个点到当前点之间的直线到Path
闭合路径 close() 连接第一个点到最后一个点,形成一个闭合区域
添加内容 addRect()、addRoundRect()、addOval()、addCircle()、addPath()、addArc()、arcTo() 添加矩形、圆角矩形、椭圆、圆、路径、圆弧到当前Path(注意addArc和arcTo的区别)
判空 isEmpty() 判断Path是否为空
是否为矩形 isRect() 判断Path是否是一个矩形
替换路径 set() 用新的路径替换当前路径所有内容
偏移路径 offset() 对当前路径之前的操作进行偏移,不会影响之后的操作
贝塞尔曲线 quadTo()、cubicTo() 分别为二阶、三阶贝塞尔曲线方法
填充模式 setFillType()、getFillType()、isInverseFillType()、toggleInverseFillType() 设置、获取、判断和切换填充模式
布尔操作 op() 对两个Path进行布尔运算(即取交集、并集等操作)
计算边界 computeBounds() 计算Path的边界
重置路径 reset()、rewind() 消除Path中的内容 reset()不保留内部数据结构,但会保留FillType,rewind()会保留内部结构,但不保留Fillype
矩阵操作 transform() 矩阵变换

Path常用方法详解

  • moveTo()、setLastPoint()、lineTo()、close()

    首先要注意的就是moveTo()和setLastPoint()的区别:

    | 方法名 | 简介 | 是否影响之前的操作 | 是否影响之后的操作 |
    | ————– | ————– | ——— | ——— |
    | moveTo() | 移动下一次操作的起点位置 | 否 | 是 |
    | setLastPoint() | 设置之前操作的最后一个点位置 | | 是 |

    简单的来说就是,moveTo()只改变下次操作的起点,而setLastPoint()是重置上一次操作的最后一个点。

    还有需要注意的是:lineTo()的起点坐标是上次绘制完的终点坐标,如果没有,则是原点坐标。

    close()方法也有需要注意的一点,close()作用是封闭路径,与连接当前最后一个点和第一个点并不等价,如果连接了第一个点和最后一个点仍然无法形成封闭图形,则close()方法什么也不做。

  • addXxx()

    这部分内容主要是在Path添加基本图形,我们依照矩形简单做一下示例。

    1
    public void addRect (float left, float top, float right, float bottom, Path.Direction dir)

    重点在该方法的最后一个参数:Path.Direction.dir,Direction是一个枚举类型,里面只有两个枚举常量:

    | 类型 | 释义 | 翻译 |
    | —- | —————– | —- |
    | CW | clockwise | 顺时针 |
    | CCW | counter-clockwise | 逆时针 |

    讲到这,就涉及到一些Path的存储问题了,对于矩形的存储,简单的就是记录坐标点,如果只记录参数中的两个坐标点的话,还需要多余一个参数来记录这是一个矩形,显然在解析的时候会很麻烦。所以索性就将矩形的四个点全部记录下来,在绘制的时候连接四个点即可,这就要决定是用顺时针还是逆时针来连接这四个点了,起点是左上角的点

实战之绘制雷达图

效果图:

只要熟练上面所讲的Path的基本操作,画一个雷达图还是很easy的。这个雷达图可以定制,由用户决定是多几边形、数据等等。

源码:

https://github.com/Omooo/ChartsDemo

我们一直都向往,面朝大海,春暖花开。 但是几人能做到,心中有爱,四季不败?